Serverless FrameworkでデプロイしようとしたらUnknown path formatというエラーで詰まった話
水上ともうします。
かなり限定される事象になると思うのですが、今回自分が詰まった事象と解決した方法について書き残すことで同じことで困っている方の助けになればと思っています。
事象
発生した事象としてはServerless Frameworkのserverless-python-requirementsというプラグインを使用してAWS環境へデプロイをしようとした際に以下のように Unknown path format
というエラーがでてしまうというものです。
$ sls deploy Serverless: Generated requirements from /c/work/mizukami-test/requirements.txt in /c/work/mizukami-test/.serverless/requirements.txt... Serverless: Installing requirements from /home/mizukami/.cache/serverless-python-requirements/58d3bf3f63b7175c0a728986ca685c72bf4e083f23856d5e53284c49bd7d2b2e_slspyc/requirements.txt ... Serverless: Docker Image: lambci/lambda:build-python3.7 Error -------------------------------------------------- Error: Unknown path format kami/.cache/serverless-python-requirements/58d3bf3f63b7175c0a728986ca685c72bf4e083f23856d5e53284c49bd7d2b2e_slspyc...
プラグインについてはここでは詳しく触れませんので以下の記事をご参照いただければと思います。
結論
いろいろ試したのですが、以下のどちらかを満たしている場合発生してしまうという結論に達しました。
以降は本当にこの条件で起きているのかを検証していきます。
- serverless-python-requirementsのバージョンが5.x
- ディレクトリがWSLのファイルシステム上(Windowsから参照できない場所)になっている
環境
検証の前に私の環境を開示します。
- Windows10 Pro バージョン 1809(ビルド 17763.1217)
- WSL *1 Ubuntu 18.04.4 LTS
- Docker Desktop for Windows 2.3.0.3(44519)
検証その1(プラグインのバージョン)
検証用のディレクトリとしてWindowsのCドライブ直下のディレクトリを用意しました。 *2
つまり2の条件を除外して、1の条件のみで発生するのか確認します。
$ ln -s /c/work/ work $ ls -l work lrwxrwxrwx 1 mizukami mizukami 8 Jun 4 15:39 work -> /c/work/
上記のディレクトリにserverless-python-requirementsプラグインを使用している任意のアプリケーションを用意します。
$ pwd /home/mizukami/work/mizukami-test $ ls -l total 0 -rw-rw-rw- 1 mizukami mizukami 497 Jun 4 15:41 handler.py -rw-rw-rw- 1 mizukami mizukami 22 Jun 4 15:41 requirements.txt -rw-rw-rw- 1 mizukami mizukami 277 Jun 4 15:44 serverless.yml
service: mizukami-test provider: name: aws runtime: python3.7 region: ap-northeast-1 plugins: - serverless-python-requirements functions: hello: handler: handler.hello custom: pythonRequirements: dockerizePip: true
ではこのディレクトリにプラグインをインストールしてデプロイを実行してみましょう。
$ sls plugin install -n serverless-python-requirements Serverless: Creating an empty package.json file in your service directory Serverless: Installing plugin "serverless-python-requirements@latest" (this might take a few seconds...) Serverless: Successfully installed "serverless-python-requirements@latest" $ cat package.json { "name": "mizukami-test", "description": "", "version": "0.1.0", "dependencies": {}, "devDependencies": { "serverless-python-requirements": "^5.1.0" } }
執筆時点では5.1.0がインストールされました。
そしてデプロイ。
$ sls deploy Serverless: Generated requirements from /c/work/mizukami-test/requirements.txt in /c/work/mizukami-test/.serverless/requirements.txt... Serverless: Installing requirements from /home/mizukami/.cache/serverless-python-requirements/58d3bf3f63b7175c0a728986ca685c72bf4e083f23856d5e53284c49bd7d2b2e_slspyc/requirements.txt ... Serverless: Docker Image: lambci/lambda:build-python3.7 Error -------------------------------------------------- Error: Unknown path format kami/.cache/serverless-python-requirements/58d3bf3f63b7175c0a728986ca685c72bf4e083f23856d5e53284c49bd7d2b2e_slspyc...
想定通り、エラーがでました!
次にプラグインのバージョンを4.3.0にしてみます。
sls plugin install -n serverless-python-requirements@4.3.0
という風にコマンドを発行すればバージョン指定ができるようです。
$ sls plugin install -n serverless-python-requirements@4.3.0 Serverless: Installing plugin "serverless-python-requirements@4.3.0" (this might take a few seconds...) Serverless: Successfully installed "serverless-python-requirements@4.3.0" $ cat package.json { "name": "mizukami-test", "description": "", "version": "0.1.0", "dependencies": {}, "devDependencies": { "serverless-python-requirements": "^4.3.0" } }
そして、同じようにデプロイしてみます。
$ sls deploy Serverless: Generated requirements from /c/work/mizukami-test/requirements.txt in /c/work/mizukami-test/.serverless/requirements.txt... Serverless: Installing requirements from /c/work/mizukami-test/.serverless/requirements/requirements.txt ... Serverless: Docker Image: lambci/lambda:build-python3.7 Serverless: Running docker run --rm -v /c/work/mizukami-test/.serverless/requirements\:/var/task\:z lambci/lambda\:build-python3.7 /bin/sh -c 'python3.7 -m pip install -t /var/task/ -r /var/task/requirements.txt && chown -R 1000\\:1000 /var/task'... Serverless: Packaging service... Serverless: Excluding development dependencies... Serverless: Injecting required Python packages to package... ........... Serverless: Stack update finished... Service Information service: mizukami-test stage: dev region: ap-northeast-1 stack: mizukami-test-dev resources: 6 api keys: None endpoints: None functions: hello: mizukami-test-dev-hello layers: None Serverless: Removing old service artifacts from S3... Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing.
デプロイできました。(やったね)
検証その2(ディレクトリの場所)
次はUbuntu(WSL)のホームディレクトリ上で同じ構成を用意してみます。
$ pwd /home/mizukami/mizukami-test $ ls -l total 0 -rw-rw-rw- 1 mizukami mizukami 497 Jun 4 12:49 handler.py -rw-rw-rw- 1 mizukami mizukami 22 Jun 4 12:49 requirements.txt -rw-rw-rw- 1 mizukami mizukami 240 Jun 4 16:18 serverless.yml
先ほどは成功したバージョン4.3.0のプラグインをインストールしてデプロイしてみましょう。
$ sls plugin install -n serverless-python-requirements@4.3.0 Serverless: Creating an empty package.json file in your service directory Serverless: Installing plugin "serverless-python-requirements@4.3.0" (this might take a few seconds...) Serverless: Successfully installed "serverless-python-requirements@4.3.0" $ cat package.json { "name": "mizukami-test", "description": "", "version": "0.1.0", "dependencies": {}, "devDependencies": { "serverless-python-requirements": "^4.3.0" } }
$ sls deploy Serverless: Generated requirements from /home/mizukami/mizukami-test/requirements.txt in /home/mizukami/mizukami-test/.serverless/requirements.txt... Serverless: Installing requirements from /home/mizukami/mizukami-test/.serverless/requirements/requirements.txt ... Serverless: Docker Image: lambci/lambda:build-python3.7 Error -------------------------------------------------- Error: Unknown path format kami/mizukami-test/.serverless/requirements...
こちらではUnknown path format
が出てしまいました。
ということで、プラグインのバージョンに関わらずこの場所ではうまくいかないと思いました。(念のため5.1.0でも試しましたがうまくいきませんでした)
感想
今回の事象、プラグインのバージョンによるものという話はネット検索で見つけることができたのですが、ディレクトリの場所によっても発生しているとはなかなか気づけなかったです。。。
おそらくかなりおま環なことだと思っているのですが、同じことで悩んでる方をこの記事で救えることを祈ります。